﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using CondominioG1.Persistencia.NHibernate;
using CondominioG1.Dominio;
using NHibernate.Criterion;


//HISTORIA: 
//Inscribo un residente debo indicar como mínimo su documento de identidad, nombres, edad, correo y clave de acceso.
//Espero:
//Confirmación de la inscripción OK.
//Mensaje de error si ya se registró el mismo documento o correo.

namespace CondominioG1.Negocio
{
    public class ResidenteService
    {
        // Dependencias con la capa de persistencia
        public ResidenteDAO ResidenteDAO { get; set; }
     
        // Mapeo de funcionalidades
        public Residente RegistrarResidente(String Dni, String Nombres, String Apellidos, Int32 Edad, String Correo, String Clave, String Tipo)
        {
            
            // Validación de DNI obligatorio
            if (null == Dni || String.Empty.Equals(Dni))
                throw new Exception("No se puede registrar un residente sin DNI");
            // Validación de longitud de DNI = 8
            if (Dni.Length != 8)
                throw new Exception("El DNI debe tener 8 posiciones");
            // Validación de existencia de un residente con el mismo DNI
            if (ResidenteDAO.Obtener(Dni) != null)
                throw new Exception("Ya existe un RESIDENTE con el DNI indicado");
            // Validación de NOMBRES
            if (null == Nombres || String.Empty.Equals(Nombres))
                throw new Exception("El dato NOMBRE es obligatorio");
            // Validación de APELLIDOS
            if (null == Apellidos || String.Empty.Equals(Apellidos))
                throw new Exception("El dato APELLIDOS es obligatorio");
            //Validación de EDAD
            if (Edad < 0)
                throw new Exception("La EDAD debe ser mayor a cero.");
            // Validación de CORREO
            if (null == Correo || String.Empty.Equals(Correo))
                throw new Exception("El dato CORREO es obligatorio");
            // Validación de si ya se registró el mismo CORREO.
            if (ResidenteDAO.ValidarCorreo(Correo) > 0)
                throw new Exception("Ya se registró el mismo CORREO");
            // Validación de CLAVE
            if (null == Clave || String.Empty.Equals(Clave))
                throw new Exception("El dato CLAVE es obligatorio");
            
            // Generar nueva secuencia para Residente
            Residente residenteACrear = new Residente();
            residenteACrear.Dni = Dni;
            residenteACrear.Nombres = Nombres;
            residenteACrear.Apellidos = Apellidos;
            residenteACrear.Edad = Edad;
            residenteACrear.Correo = Correo;
            residenteACrear.Clave = Clave;
            residenteACrear.Tipo = Tipo;

            Residente ResidenteCreado = ResidenteDAO.Crear(residenteACrear);
            return ResidenteCreado;
        }

        public Residente ModificarResidente(String Dni, String Nombres, String Apellidos, Int32 Edad, String Correo, String Clave, String Tipo)
        {
            // Validacion de existencia de Residente
            Residente ResidenteExistente = ResidenteDAO.Obtener(Dni);
            if (null == ResidenteExistente)
                throw new Exception("El RESIDENTE no existe...");

            // Validación de NOMBRES
            if (null == Nombres || String.Empty.Equals(Nombres))
                throw new Exception("El dato NOMBRE es obligatorio");
            // Validación de APELLIDOS
            if (null == Apellidos || String.Empty.Equals(Apellidos))
                throw new Exception("El dato APELLIDOS es obligatorio");
            //Validación de EDAD
            if (Edad < 0)
                throw new Exception("La EDAD debe ser mayor a cero.");
            // Validación de CORREO
            if (null == Correo || String.Empty.Equals(Correo))
                throw new Exception("El dato CORREO es obligatorio");
            // Validación de CLAVE
            if (null == Clave || String.Empty.Equals(Clave))
                throw new Exception("El dato CLAVE es obligatorio");

            Residente residenteAModificar = new Residente();
            residenteAModificar = ResidenteExistente;
            residenteAModificar.Nombres = Nombres;
            residenteAModificar.Apellidos = Apellidos;
            residenteAModificar.Edad = Edad;
            residenteAModificar.Correo = Correo;
            residenteAModificar.Clave = Clave;
            residenteAModificar.Tipo = Tipo;

            Residente ResidenteModificado = ResidenteDAO.Modificar(residenteAModificar);
            return ResidenteModificado;
        }

        public Residente EliminarResidente(String Dni)
        {
            // Validacion de existencia de Residente
            Residente ResidenteExistente = ResidenteDAO.Obtener(Dni);
            if (null == ResidenteExistente)
                throw new Exception("El RESIDENTE no existe...");

            Residente Residente = new Residente();
            Residente = ResidenteExistente;
            ResidenteDAO.Eliminar(Residente);
            return Residente;
        }

        public void Eliminar(Residente residente)
        {
            // Aquí deben ir las validaciones, reglas de negocio, algoritmos, etc.
            ResidenteDAO.Eliminar(residente);
        }

        public Residente ObtenerResidente(String Dni)
        {
            // Aquí deben ir las validaciones, reglas de negocio, algoritmos, etc.
            return ResidenteDAO.Obtener(Dni);
        }

        public ICollection<Residente> ListarTodosLosResidentes()
        {
            return ResidenteDAO.Listar(DetachedCriteria.For<Residente>());
        }

        public ICollection<Residente> ListarResidentePorCorreo(String Dominio)
        {
            return ResidenteDAO.ListarResidentePorCorreo(Dominio);
        }


        public void EliminarResidentes()
        {
            foreach (Residente residente in ResidenteDAO.Listar(DetachedCriteria.For<Residente>()))
                ResidenteDAO.Eliminar(residente);
        }
    }
}
